package com.liu.io;

import java.io.*;


/**
 * 字节输入\输出流：
 *    1.字节流和字符流的基本操作是相同的，但是要想操作媒体流就需要用到字节流。
 *         读写字节流：InputStream 输入流（读）和OutputStream 输出流（写）
 *    2.字符流是可以直接读写字符的IO流，字符流读取字符，就要先读取到字节数据，然后转为字符.
 *         读写字节流：Reader输入流（读）和Writer 输出流（写）
 * Writer比OutputStream多出两个方法，主要是支持写入字符和字符串类型的数据。
 * 使用Java的IO流执行输出时，不要忘记关闭输出流，关闭输出流除了可以保证流的物理资源被回收之外，还能将输出流缓冲区的数据flush到物理节点里
 *（因为在执行close()方法之前，自动执行输出流的 flush()方法）
 */
public class StreamTest {
    public static void main(String[] args) {
        //创建输入文件对象
        File infile = new File("D:\\inputfile.txt");
        //创建输入文件对象
        File outFile = new File("D:\\outfile.txt");
        FileInputStream inputStream = null;
        FileOutputStream outputStream = null;
        try {
            //创建输入流
            inputStream = new FileInputStream(infile);
            //创建输出流
            outputStream = new FileOutputStream(outFile);
            //缓冲区字节数组
            byte[] bytes = new byte[1024];
            //记录读取的字节数
            int length;
            //循环读取字节，返回-1时读取完毕
            while ((length = inputStream.read(bytes))!=-1){
                //写入读取的字节
                outputStream.write(bytes,0,length);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //当输入流不为空时
                if (inputStream!= null){
                    //关闭输入流
                    inputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                //当输出流不为空时
                if (outputStream!= null){
                    //关闭输出流
                    outputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    /**
     *  输出流
     */
    private static void outputFile() {
        //创建文件对象
        File file = new File("D:\\inputfile.txt");
        FileOutputStream outputStream = null;
        try {
            //创建文件字节输出流对象，第二个参数是指定写入方式
            outputStream = new FileOutputStream(file,true);
            //追加内容
            outputStream.write("我输入了内容！！".getBytes());

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //当输出流不为空时
                if (outputStream!= null){
                    //关闭输出流
                    outputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     *  输入流
     */
    private static void readFile() {
        //创建文件对象
        File file = new File(" data/");
        FileInputStream inputStream = null;
        try {
            //创建输入流
            inputStream = new FileInputStream(file);
            //记录读取的字节数
            int read;
            //循环读取，一次读取一个字符
            while ((read = inputStream.read()) != -1) {
                //输出字符
                System.out.print((char) read);
            }
            System.out.println();
            System.out.println("程序执行完毕");
        }  catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                //当输入流不为空时
                if (inputStream!= null){
                    //关闭输入流
                    inputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}
